package cn.gx.kevin.common.utils;

import java.util.LinkedList;

/**
 * 用于动态拼接sql 条件，无需要再一个一个写sql where-if，只需要设置一个 whereFields 条件
 *
 * @author kevin.huang
 * @date 2019/10/08
 */
public class WhereField {

    String op;
    String fieldName;
    String exp;
    Object paramValue;

      /**
      * mybatis的jdbc,请参考cn.gx.kevin.common.utils.MybatisJDBCTypeName
      */
      String jdbcType = null;

      /*****  mybatis jdbc type 请参考cn.gx.kevin.common.utils.MybatisJDBCTypeName ********/
      public String getJdbcType() {
          return jdbcType;
      }

        /*****  mybatis jdbc type 请参考cn.gx.kevin.common.utils.MybatisJDBCTypeName ********/
        public void setJdbcType(String jdbcType) {
            jdbcType = MybatisJDBCTypeName.getLegalTypeName(jdbcType);
        }

    /**
     * @param op         : sql 中的 and /or
     * @param fieldName  ： 字段名称
     * @param exp        ：sql 条件表达式，= / <> / > / < / link / in
     * @param paramValue : 参数值
     * @param jdbcTypeName : mybatis jdbc typeNaem 请参考cn.gx.kevin.common.utils.MybatisJDBCTypeName
     ***/
    public WhereField(String op, String fieldName, String exp, Object paramValue,String jdbcTypeName) {
        this.op = op;
        this.fieldName = WhereField.beanName2FieldName(fieldName);
        this.exp = exp;
        this.paramValue = paramValue;
        this.jdbcType = jdbcTypeName;
    }


    /**
     * @param op         : sql 中的 and /or
     * @param fieldName  ： 字段名称
     * @param exp        ：sql 条件表达式，= / <> / > / < / link / in
     * @param paramValue : 参数值
     ***/
    public WhereField(String op, String fieldName, String exp, Object paramValue) {
        this.op = op;
        this.fieldName = WhereField.beanName2FieldName(fieldName);
        this.exp = exp;
        this.paramValue = paramValue;
    }

    /*****
     *
     * 对应map 总的参数名称
     *****/
    public Object getParamName() {
        return paramValue;
    }

    /*****
     *
     * 对应map 总的参数名称
     *****/
    public void setParamName(Object paramValue) {
        this.paramValue = paramValue;
    }

    /*****
     * sql 中的 and /or
     *****/
    public String getOp() {
        return op;
    }

    /*****
     * sql 中的 and /or
     *****/
    public void setOp(String op) {
        this.op = op;
    }

    /*****
     * sql 中字段名称
     *****/
    public String getFieldName() {
        return fieldName;
    }

    /*****
     * sql 中字段名称
     *****/
    public void setFieldName(String fieldName) {
        this.fieldName = WhereField.beanName2FieldName(fieldName);
    }

    /*****
     * sql 条件表达式，= / <> / > / < / link / in
     *****/
    public String getExp() {
        return exp;
    }

    /*****
     * sql 条件表达式，= / <> / > / < / link / in
     *****/
    public void setExp(String exp) {
        this.exp = exp;
    }

    /***
     *
     * 获取有序的where 字段列表
     ****/
    public static LinkedList<WhereField> getWhereFieldList() {
        return new LinkedList<WhereField>();
    }

    /***
     *
     * 将javabean的字段名转为 表字段名称，利用大写分割原则 补充上 bean_name as beanName
     ****/
    public static String beanName2FieldNameForSelect(String beanName) {
        return beanName2FieldName(beanName) + " as " + beanName;
    }

    /***
     *
     * 将javabean的字段名转为 表字段名称，利用大写分割原则
     ****/
    public static String beanName2FieldName(String beanName) {
        String[] ss = beanName.split("(?<!^)(?=[A-Z])");
        StringBuffer buffer = new StringBuffer();
        int len = ss.length;
        for (int i = 0; i < len; i++) {
            buffer.append(ss[i].replaceAll("(^_|_$)", ""));
            if (i < len - 1) {
                buffer.append("_");
            }
        }
        return buffer.toString();
    }

}
